package com.ddc.study.net;

import com.ddc.study.entity.Article;
import com.ddc.study.entity.Banner;
import com.ddc.study.entity.CollectWebsite;
import com.ddc.study.entity.Collection;
import com.ddc.study.entity.Friend;
import com.ddc.study.entity.HotKey;
import com.ddc.study.entity.MainData;
import com.ddc.study.entity.Navigation;
import com.ddc.study.entity.Tree;
import com.ddc.study.entity.User;
import com.ddc.study.net.response.BaseResponse;

import java.util.List;

import androidx.annotation.IntRange;
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Path;
import retrofit2.http.Query;

/**
 * Created on 2018/3/28.
 *
 * @author lshun
 * @version 1.0
 */
public interface ApiService {
    /**
     * 首页文章列表
     *
     * @param pageIndex 页码(从0开始)
     * @return 文章列表信息
     */
    @GET("article/list/{page}/json")
    Call<BaseResponse<MainData<Article>>> getArticleList(@Path("page") int pageIndex);

    /**
     * 首页banner
     */
    @GET("banner/json")
    Call<BaseResponse<List<Banner>>> getBanner();

    /**
     * 常用网站
     */
    @GET("friend/json")
    Call<BaseResponse<List<Friend>>> getFriendSite();

    /**
     * 搜索热词
     */
    @GET("hotkey/json")
    Call<BaseResponse<List<HotKey>>> getHotKey();

    /**
     * 体系数据
     */
    @GET("tree/json")
    Call<BaseResponse<List<Tree>>> getTreeData();

    /**
     * 知识体系下的文章
     */
    @GET("article/list/{page}/json")
    Call<BaseResponse<MainData<Article>>> getTreeArticle(@Path("page") int pageIndex,
                                                         @Query("cid") String cid);

    /**
     * 导航数据
     */
    @GET("navi/json")
    Call<BaseResponse<List<Navigation>>> getNavigationData();

    /**
     * 项目分类
     */
    @GET("project/tree/json")
    Call<BaseResponse<List<Tree>>> getProjectTree();

    /**
     * 项目列表数据
     */
    @GET("project/list/{page}/json")
    Call<BaseResponse<MainData<Article>>> getProjectData(@Path("page") int pageIndex,
                                                         @Query("cid") String cid);

    /**
     * 登录
     *
     * @param username 用户名
     * @param password 密码
     * @return 登陆结果
     */
    @FormUrlEncoded
    @POST("user/login")
    Call<BaseResponse<User>> login(@Field("username") String username,
                                   @Field("password") String password);

    /**
     * 注册
     *
     * @param username   用户名
     * @param password   密码
     * @param rePassword 密码重复确认
     * @return 登陆结果
     */
    @FormUrlEncoded
    @POST("user/register")
    Call<BaseResponse<User>> register(@Field("username") String username,
                                      @Field("password") String password,
                                      @Field("repassword") String rePassword);

    //收藏（所有的收藏都需要登录操作，需要将cookie持久化到本地）

    /**
     * 收藏文章列表
     *
     * @param pageIndex from 0
     */
    @GET("lg/collect/list/{page}/json")
    Call<BaseResponse<MainData<Collection>>> getCollectArticle(@Path("page")
                                                               @IntRange(from = 0) int pageIndex);

    /**
     * 收藏站内文章
     */
    @POST("lg/collect/{id}/json")
    Call<BaseResponse<Object>> collectInnerArticle(@Path("id") int id);

    /**
     * 收藏站外文章
     */
    @FormUrlEncoded
    @POST("lg/collect/add/json")
    Call<BaseResponse<Object>> collectOuterArticle(@Field("title") String title,
                                                   @Field("author") String author,
                                                   @Field("link") String link);

    //取消收藏（文章列表和我的收藏页面均可触发）

    /**
     * 在文章列表中取消收藏
     *
     * @param id 文章id
     */
    @POST("lg/uncollect_originId/{id}/json")
    Call<BaseResponse<Object>> unCollectArticle1(@Path("id") int id);

    /**
     * 在我的收藏中取消收藏
     * <p>
     * originId 代表的是你收藏之前的那篇文章本身的id；
     * 但是收藏支持主动添加，这种情况下，没有originId则为-1
     *
     * @param originId 列表页下发 无效则为-1
     */
    @FormUrlEncoded
    @POST("lg/uncollect/{id}/json")
    Call<BaseResponse<Object>> unCollectArticle2(@Path("id") int id,
                                                 @Field("originId") int originId);

    /**
     * 收藏网站列表
     */
    @GET("lg/collect/usertools/json")
    Call<BaseResponse<List<CollectWebsite>>> getCollectList();

    /**
     * 收藏网址
     */
    @FormUrlEncoded
    @POST("lg/collect/addtool/json")
    Call<BaseResponse<CollectWebsite>> collectLink(@Field("name") String name,
                                                   @Field("link") String link);

    /**
     * 编辑收藏网站
     */
    @FormUrlEncoded
    @POST("lg/collect/updatetool/json")
    Call<BaseResponse<CollectWebsite>> editCollectLink(@Field("id") String id,
                                                       @Field("name") String name,
                                                       @Field("link") String link);

    /**
     * 删除收藏网站
     */
    @FormUrlEncoded
    @POST("lg/collect/deletetool/json")
    Call<BaseResponse<Object>> deleteLink(@Field("id") String id);


    /**
     * 搜索
     *
     * @param keyword 搜索关键词
     *                支持多个关键词，用空格隔开
     */
    @FormUrlEncoded
    @POST("article/query/{page}/json")
    Call<BaseResponse<MainData<Article>>> queryArticle(@Path("page") int pageIndex,
                                                       @Field("k") String keyword);
}
